package com.tedu.review.day02;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

/**
 * 抽象类的特点:<补充>
 *                     抽象类=类:成员变量+构造器+成员方法
 *                     成员变量:既可以是变量,也可以是常量
 *                     构造方法:有
 *                            用于子类访问父类的数据【父类默认初始化】
 *                     成员方法:既可以是抽象也可以是非抽象的
 *
 *
 *                     抽象方法的特性:
 *                     A:抽象方法---目的:强制子类作的事情【子类一定重写】
 *                     B:非抽象方法---目的:子类继承的事情,提高代码复用性【与普通父类一样】
 *
 *
 *
 */
 abstract class Foo{
     //成员变量
    public int i=10;
    //成员变量修饰加上final 也可以叫常量【识别常量:标识符全大写】
    public final int J=20;  //Java强类型语言:标识符大小写分明
   // public int j=30;

    public Foo() {//创建对象的同时一并创建:初始化--传输成员变量数据
        this(30);
        //this()调用本类其他构造器 调用有参数--当前属性/成员变量重新赋值
    }

    public Foo(int i) {
        this.i = i;
    }
    //成员方法:抽象{重写}  非抽象【提高复用-继承父类】
    public  abstract void show();
    public void  method(){
        System.out.println("Foo---method");
    }
}
//无法实例化【无法直接创建对象】---继承---多态性---利用造型
//Goo 子类【实现类】继承 抽象类  子类必须重写抽象类中所有抽象方法
class Goo extends Foo{


    public void show() {//抽象类  抽象方法show()----一定重写
        System.out.println("show Goo");

    }
    public void method(){
        System.out.println("Goo method");
    }
}




public class 抽象类的特点1 {
    public static void main(String[] args) {
        //创建对象---实例化
        Foo f=new Goo();
        // 1实例化---初始化Goo()构造器 类默认存在空构造器
        // 2空构造器默认存在:super() 调用父类的无参构造器
        // 3父类无参构造器中存在:this() 调用本类有参构造器
        // 4this(参数)给Foo抽象类的i值进行覆盖 i=30
        System.out.println(f.i); //5 引用调取i值  打印30
        //调取抽象类常量  不可以给常量赋值

        System.out.println(f.J);
        //----------------------------------------------------------------------------------------------------------
        f.show(); // 抽象方法 一定被子类重写  Goo show
        f.method();//非抽象方法 选择实现重写   Goo show






















    }
}
